package Biblioteca

import Contas.Administrador 
import Contas.Usuario 
import org.springframework.security.ui.webapp.AuthenticationProcessingFilter 

class RelatorioTecnicoController {
	
    static relatorioResult
	static consulta

    def tiposRelatorioTecnico = TipoRelatorioTecnico.executeQuery("select tipo from TipoRelatorioTecnico")         

    static allowedMethods = [save: "POST", update: "POST", delete: "POST"]

    def index = {
        redirect(action: "list", params: params)
    }
	
	private String getTipoUsuario (){
		def username = session[AuthenticationProcessingFilter.SPRING_SECURITY_LAST_USERNAME_KEY]
		Usuario user = Contas.Usuario.findByUsername(username)
		def tipo
		if (Administrador.get(user.id)==null){
			tipo = "Usuario"
		}else{
			tipo = "Admin"
		}
	return tipo
	}
	
	def reservar = {
		def relatorioInstance = RelatorioTecnico.get(params.id)
		def emprestados = Emprestimo.executeQuery("select id from Emprestimo where idItem = " + relatorioInstance.id+" and tipo = 'relatorio'")
		def reservados = Reserva.executeQuery("select id from Reserva where idItem = " + relatorioInstance.id+" and tipo = 'relatorio'")
		def jatemEmprestimo = false
		
		
		def username = session[AuthenticationProcessingFilter.SPRING_SECURITY_LAST_USERNAME_KEY]
		def dataHoje = new Date()
		def reservaInstance = new Reserva()
		reservaInstance.idItem = Integer.parseInt (params.id)
		reservaInstance.dataReserva = dataHoje
		reservaInstance.username = username.toString()
		reservaInstance.titulo = relatorioInstance.titulo
		reservaInstance.tipo = 'relatorio'
		
		def emprestimos_usuario = Emprestimo.executeQuery("select id from Emprestimo where login = " + "'" + username.toString() + "'")
		def reservas_usuario = Reserva.executeQuery("select idItem from Reserva where username = " + "'" + username.toString()+ "'" +" and tipo = 'relatorio'")
		
		for (emprestimo in emprestimos_usuario){
			def relatorio_emprestimo = Emprestimo.executeQuery("select idItem from Emprestimo where idItem = " + emprestimo + " and tipo='relatorio'")
			if (relatorio_emprestimo.contains (relatorioInstance.id)){
				flash.message = "Voce ja possui um emprestimo deste Relatorio Tecnico."
				jatemEmprestimo = true
			}
		}
		if (reservas_usuario.contains(relatorioInstance.id)){
			flash.message = "Voce ja possui uma reserva deste Relatorio Tecnico."
		}else if (!jatemEmprestimo && ((1 - emprestados.size() - reservados.size()) > 0) && reservaInstance.save()){
			flash.message = "${message(code: 'Relatorio Tecnico Reservado com sucesso!', args: [message(code: 'Livro Reservado com sucesso!', default: 'Livro Reservado com sucesso!'), params.id])}"
			
		}else if (!jatemEmprestimo){
			flash.message = "Relatorio Tecnico indisponivel."
			
		}
		redirect(action: "show", id: params.id)
		
	}

    def list = {
        params.max = Math.min(params.max ? params.int('max') : 10, 100)
        [relatorioTecnicoInstanceList: RelatorioTecnico.list(params), relatorioTecnicoInstanceTotal: RelatorioTecnico.count(), tiposRelatorioTecnico:tiposRelatorioTecnico, tipo:this.getTipoUsuario ()]
    }
	
	def search = {return [tipo:this.getTipoUsuario ()]	}
	
	def search_relatorio = {return [tipo:this.getTipoUsuario(), tiposRelatorioTecnico:tiposRelatorioTecnico]}
	
	def results_relatorios ={
		if (!params.max) params.max = 50
		if (!params.offset) params.offset = 0
		if (!params.sort) params.sort = "id"
		if (!params.order) params.order = "asc"
		
		consulta = params
		println(params)
		println(consulta)

		def criteria = RelatorioTecnico.createCriteria()
		
		relatorioResult = criteria {
			maxResults(params.max?.toInteger())
			firstResult(params.offset?.toInteger())
			order(params.sort, params.order)
			and{ like('titulo','%' + params.titulo + '%')
				 like('autores','%' + params.autores + '%')
				 
				 if(params.tipo != ' '){
					 like('tipo','%' + params.tipo + '%')
				 }
				 
				 if(params.ano != ' '){				
					 like('ano', '%' + params.ano + '%')
				 }
				 
			}
		}
		
		[pesquisaRelatorio: relatorioResult, params : params, tipo:this.getTipoUsuario ()]
	}
	
	def results ={
		if (!params.max) params.max = 50
		if (!params.offset) params.offset = 0
		if (!params.sort) params.sort = "id"
		if (!params.order) params.order = "asc"
		
		consulta = params
		println(params)
		println(consulta)

		def criteria = RelatorioTecnico.createCriteria()
		
		relatorioResult = criteria {
			maxResults(params.max?.toInteger())
			firstResult(params.offset?.toInteger())
			order(params.sort, params.order)
			and{ like('titulo','%' + params.titulo + '%') }
		}
		
		[pesquisaRelatorio: relatorioResult, params : params, tipo:this.getTipoUsuario ()]
	}

    def create = {
        [relatorio: new RelatorioTecnico(params), tiposRelatorioTecnico:tiposRelatorioTecnico, tipo:this.getTipoUsuario ()]
    }

    def save = {
        def relatorio = new RelatorioTecnico()
        relatorio.properties = params

	if (params.tipo[0].toString().equals("Novo Tipo")){
            def novoTipo = new TipoRelatorioTecnico(tipo: params.tipo[1].toString())
		if (novoTipo.save()){
			relatorio.properties.tipo = params.tipo[1].toString()
		}else{
			relatorio.properties.tipo = ''
		}
	}else {
	   relatorio.properties.tipo = params.tipo[0].toString()
	}

        if (relatorio.save()) {
            flash.message = "${message(code: 'default.created.message', args: [message(code: 'relatorioTecnico.label', default: 'RelatorioTecnico'), relatorio.id])}"
            redirect(action: "show", id: relatorio.id)
        }
        else {
            render(view: "create", model: [relatorioTecnicoInstance: relatorio, tiposRelatorioTecnico:tiposRelatorioTecnico, tipo:this.getTipoUsuario ()])
        }

   }

    def show = {
        def relatorioTecnicoInstance = RelatorioTecnico.get(params.id)

        if (!relatorioTecnicoInstance) {
            flash.message = "${message(code: 'default.not.found.message', args: [message(code: 'relatorioTecnico.label', default: 'RelatorioTecnico'), params.id])}"
            redirect(action: "list")
        }
        else {
            [relatorioTecnicoInstance: relatorioTecnicoInstance, , tipo:this.getTipoUsuario ()]
        }
    }

    def edit = {
        def relatorioTecnicoInstance = RelatorioTecnico.get(params.id)
        if (!relatorioTecnicoInstance) {
            flash.message = "${message(code: 'default.not.found.message', args: [message(code: 'relatorioTecnico.label', default: 'RelatorioTecnico'), params.id])}"
            redirect(action: "list")
        }
        else {
            return [relatorioTecnicoInstance: relatorioTecnicoInstance, tiposRelatorioTecnico:tiposRelatorioTecnico, tipo:this.getTipoUsuario ()]
        }
    }

    def update = {
        def relatorioTecnicoInstance = RelatorioTecnico.get(params.id)

        if (params.tipo[0].toString().equals("Novo Tipo")){
			def novoTipo = new TipoRelatorioTecnico(tipo: params.tipo[1].toString())

			if (novoTipo.save()){
				params.tipo = novoTipo.tipo.toString()
			}else{
				params.tipo = ''
			}

	   }else {
		  params.tipo = params.tipo[0].toString()
	   }

        if (relatorioTecnicoInstance) {
            if (params.version) {
                def version = params.version.toLong()
                if (relatorioTecnicoInstance.version > version) {
                    
                    relatorioTecnicoInstance.errors.rejectValue("version", "default.optimistic.locking.failure", [message(code: 'relatorioTecnico.label', default: 'RelatorioTecnico')] as Object[], "Another user has updated this RelatorioTecnico while you were editing")
                    render(view: "edit", model: [relatorioTecnicoInstance: relatorioTecnicoInstance])
                    return
                }
            }
            relatorioTecnicoInstance.properties = params
            if (!relatorioTecnicoInstance.hasErrors() && relatorioTecnicoInstance.save(flush: true)) {
                flash.message = "${message(code: 'default.updated.message', args: [message(code: 'relatorioTecnico.label', default: 'RelatorioTecnico'), relatorioTecnicoInstance.id])}"
                redirect(action: "show", id: relatorioTecnicoInstance.id)
            }
            else {
                render(view: "edit", model: [relatorioTecnicoInstance: relatorioTecnicoInstance, tipo:this.getTipoUsuario ()])
            }
        }
        else {
            flash.message = "${message(code: 'default.not.found.message', args: [message(code: 'relatorioTecnico.label', default: 'RelatorioTecnico'), params.id])}"
            redirect(action: "list")
        }
    }


    def delete = {
        def relatorioTecnicoInstance = RelatorioTecnico.get(params.id)
        if (relatorioTecnicoInstance) {
            try {
                relatorioTecnicoInstance.delete(flush: true)
                flash.message = "${message(code: 'default.deleted.message', args: [message(code: 'relatorioTecnico.label', default: 'RelatorioTecnico'), params.id])}"
                redirect(action: "list")
            }
            catch (org.springframework.dao.DataIntegrityViolationException e) {
                flash.message = "${message(code: 'default.not.deleted.message', args: [message(code: 'relatorioTecnico.label', default: 'RelatorioTecnico'), params.id])}"
                redirect(action: "show", id: params.id)
            }
        }
        else {
            flash.message = "${message(code: 'default.not.found.message', args: [message(code: 'relatorioTecnico.label', default: 'RelatorioTecnico'), params.id])}"
            redirect(action: "list")
        }
    }

    def createReportRelatorioSimple = {
        def relatorios = relatorioResult
		
		
		String caminhoLogoSPL = System.getProperty("user.dir") + "\\web-app\\reports\\logo_spl_report.jpg";
		String caminhoLogoGMF = System.getProperty("user.dir") + "\\web-app\\reports\\gmf.jpg";
				
		params.put("logoSPL", caminhoLogoSPL);
		params.put("logoGMF", caminhoLogoGMF);
		params.put("tituloConsulta", consulta.titulo);
		params.put("tituloConsulta", consulta.titulo);
		
        chain(controller:'jasper',action:'index',model:[data:relatorios],params:params)
    }
	
	def createReportRelatorioComplete = {
		def relatorios = relatorioResult
		
		
		String caminhoLogoSPL = System.getProperty("user.dir") + "\\web-app\\reports\\logo_spl_report.jpg";
		String caminhoLogoGMF = System.getProperty("user.dir") + "\\web-app\\reports\\gmf.jpg";
				
		params.put("logoSPL", caminhoLogoSPL);
		params.put("logoGMF", caminhoLogoGMF);
		
		params.put("tituloConsulta", consulta.titulo);
		params.put("autoresConsulta", consulta.autores);
		params.put("anoConsulta", consulta.ano);
		params.put("tipoConsulta", consulta.tipo);
		
		chain(controller:'jasper',action:'index',model:[data:relatorios],params:params)
	}
}
